package com.mini.grpc.client;

import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;

/**
 * ChannelBuilder是构建ManagedChannel的抽象基类。
 *
 * @param <T> 构建器类型，用于方法链式调用
 */
public abstract class ChannelBuilder<T extends ChannelBuilder<T>> {
    
    private Executor executor;
    private long deadlineAfterInNanos = 0;
    private boolean usePlaintext = false;
    
    /**
     * 返回this的类型转换，用于方法链式调用
     *
     * @return this的类型转换
     */
    protected abstract T thisT();
    
    /**
     * 设置执行器
     *
     * @param executor 执行器
     * @return this
     */
    public T executor(Executor executor) {
        this.executor = executor;
        return thisT();
    }
    
    /**
     * 获取执行器
     *
     * @return 执行器
     */
    public Executor getExecutor() {
        return executor;
    }
    
    /**
     * 设置默认的调用截止时间
     *
     * @param duration 持续时间
     * @param unit 时间单位
     * @return this
     */
    public T deadlineAfter(long duration, TimeUnit unit) {
        this.deadlineAfterInNanos = unit.toNanos(duration);
        return thisT();
    }
    
    /**
     * 获取默认的调用截止时间（纳秒）
     *
     * @return 截止时间（纳秒）
     */
    public long getDeadlineAfterInNanos() {
        return deadlineAfterInNanos;
    }
    
    /**
     * 设置使用明文通信（不使用SSL/TLS）
     *
     * @return this
     */
    public T usePlaintext() {
        this.usePlaintext = true;
        return thisT();
    }
    
    /**
     * 是否使用明文通信
     *
     * @return 如果使用明文通信则返回true，否则返回false
     */
    public boolean isUsePlaintext() {
        return usePlaintext;
    }
    
    /**
     * 设置默认负载均衡策略
     *
     * @param policy 负载均衡策略
     * @return this
     */
    public T defaultLoadBalancingPolicy(String policy) {
        // 默认实现，子类可以重写
        return thisT();
    }
    
    /**
     * 设置keepalive时间
     *
     * @param keepAliveTime keepalive时间
     * @param unit 时间单位
     * @return this
     */
    public T keepAliveTime(long keepAliveTime, TimeUnit unit) {
        // 默认实现，子类可以重写
        return thisT();
    }
    
    /**
     * 设置keepalive超时时间
     *
     * @param keepAliveTimeout keepalive超时时间
     * @param unit 时间单位
     * @return this
     */
    public T keepAliveTimeout(long keepAliveTimeout, TimeUnit unit) {
        // 默认实现，子类可以重写
        return thisT();
    }
    
    /**
     * 设置是否在没有活跃调用时发送keepalive
     *
     * @param enable 是否启用
     * @return this
     */
    public T keepAliveWithoutCalls(boolean enable) {
        // 默认实现，子类可以重写
        return thisT();
    }
    
    /**
     * 设置最大入站消息大小
     *
     * @param bytes 最大字节数
     * @return this
     */
    public T maxInboundMessageSize(int bytes) {
        // 默认实现，子类可以重写
        return thisT();
    }
    
    /**
     * 构建一个新的ManagedChannel
     *
     * @return 新的ManagedChannel
     */
    public abstract ManagedChannel build();
} 